#include "MR88FX02.h"
#include "Orion_Lcd.h"
#include "Orion_Gpio.h"
#include "Orion_System.h"
/*NOTES: SEG begin with 1,com begin with 1
PA0		SEG19
PA12	SEG20
PA13	SEG21
PA14	SEG22
PA15	SEG23
PB0		SEG24
PB6		SEG25/COM8
PB7		SEG26/COM7
PB8		SEG27/COM6
PB9		SEG28/COM5

PB10				COM4
PB11				COM3
PB12				COM2
PB13				COM1

PB14	SEG1					/SWE
PB15	SEG2
PC0		SEG3
PC1		SEG4
PC2		SEG5
PC3		SEG6
PC4		SEG7
PC5		SEG8
PC6		SEG9
PC7		SEG10
PC8		SEG11
PC9		SEG12
PC10	SEG13
PC11	SEG14
PC12	SEG15
PD0		SEG16
PD1		SEG17 SWE
PD2		SEG18
*/
void LCD_Initial(lcd_initstruct *lcdinitstruct)
{
	Device_CLK_Enable(set_io,enable);
	Device_CLK_Enable(set_lcd,enable);
	LCDC->LCDBIAS_b.LCDBIAS=lcdinitstruct->vlcd;	//gray setting
	LCDC->LCDBIAS_b.BIASEN =1;
	LCDC->LCDCTRL_b.DISPMD=0;		
	LCDC->LCDDF_b.DF=0x40;	//display frequency	
	LCDC->LCDSET_b.BIASMD  =lcdinitstruct->lcdbias;
	LCDC->LCDSET_b.WFT		 =lcdinitstruct->lcdclass;
	
	/*******************************com initial*******************************/
	if(lcdinitstruct->lcddspcom<5)
	{
		LCDC->LCDSET_b.COMNUM	=4;
		GPIO_Initial(GPIOB,Pin_Num_13,GPIO_ANALOG,Func0);//com0
		GPIO_Initial(GPIOB,Pin_Num_12,GPIO_ANALOG,Func0);//com1	
		GPIO_Initial(GPIOB,Pin_Num_11,GPIO_ANALOG,Func0);//com2
		GPIO_Initial(GPIOB,Pin_Num_10,GPIO_ANALOG,Func0);//com3	
		LCDC->LCDCOM_EN_b.COMEN0=1;
		LCDC->LCDCOM_EN_b.COMEN1=1;
		LCDC->LCDCOM_EN_b.COMEN2=1;
		LCDC->LCDCOM_EN_b.COMEN3=1;
	}
	else if(lcdinitstruct->lcddspcom ==5)
	{
		LCDC->LCDSET_b.COMNUM	=3;
		GPIO_Initial(GPIOB,Pin_Num_9,GPIO_ANALOG,Func0);	//com4
		LCDC->LCDCOM_EN_b.COMEN4=1;
	}
	else if(lcdinitstruct->lcddspcom ==6)
	{
		LCDC->LCDSET_b.COMNUM	=2;
		GPIO_Initial(GPIOB,Pin_Num_9,GPIO_ANALOG,Func0);//com4
		GPIO_Initial(GPIOB,Pin_Num_8,GPIO_ANALOG,Func0);//com5
		LCDC->LCDCOM_EN_b.COMEN4=1;
		LCDC->LCDCOM_EN_b.COMEN5=1;
	}
	else if(lcdinitstruct->lcddspcom ==7)
	{
		LCDC->LCDSET_b.COMNUM	=1;
		GPIO_Initial(GPIOB,Pin_Num_9,GPIO_ANALOG,Func0);//com4
		GPIO_Initial(GPIOB,Pin_Num_8,GPIO_ANALOG,Func0);//com5
		GPIO_Initial(GPIOB,Pin_Num_7,GPIO_ANALOG,Func0);//com6
		LCDC->LCDCOM_EN_b.COMEN4=1;
		LCDC->LCDCOM_EN_b.COMEN5=1;
		LCDC->LCDCOM_EN_b.COMEN6=1;
	}
	else if(lcdinitstruct->lcddspcom ==8)
	{
		LCDC->LCDSET_b.COMNUM	=0;
		GPIO_Initial(GPIOB,Pin_Num_9,GPIO_ANALOG,Func0);//com4
		GPIO_Initial(GPIOB,Pin_Num_8,GPIO_ANALOG,Func0);//com5
		GPIO_Initial(GPIOB,Pin_Num_7,GPIO_ANALOG,Func0);//com6
		GPIO_Initial(GPIOB,Pin_Num_6,GPIO_ANALOG,Func0);//com7
		LCDC->LCDCOM_EN_b.COMEN4=1;
		LCDC->LCDCOM_EN_b.COMEN5=1;
		LCDC->LCDCOM_EN_b.COMEN6=1;
		LCDC->LCDCOM_EN_b.COMEN7=1;
	}	
	/*******************************seg initial*******************************/
	if(lcdinitstruct->lcddspseg &0x01)
	{
		GPIO_Initial(GPIOB,Pin_Num_14,GPIO_ANALOG,Func0);	//SEG1
		LCDC->LCDSEG_EN_b.SEGEN0=1;
	}
	if(lcdinitstruct->lcddspseg &0x02)
	{
		GPIO_Initial(GPIOB,Pin_Num_15,GPIO_ANALOG,Func0);	//SEG2
		LCDC->LCDSEG_EN_b.SEGEN1=1;
	}
	if(lcdinitstruct->lcddspseg &0x04)
	{
		GPIO_Initial(GPIOC,Pin_Num_0,GPIO_ANALOG,Func0);	//SEG3
		LCDC->LCDSEG_EN_b.SEGEN2=1;
	}
	if(lcdinitstruct->lcddspseg &0x08)
	{
		GPIO_Initial(GPIOC,Pin_Num_1,GPIO_ANALOG,Func0);	//SEG4
		LCDC->LCDSEG_EN_b.SEGEN3=1;
	}
	if(lcdinitstruct->lcddspseg &0x10)
	{
		GPIO_Initial(GPIOC,Pin_Num_2,GPIO_ANALOG,Func0);	//SEG5
		LCDC->LCDSEG_EN_b.SEGEN4=1;
	}
	if(lcdinitstruct->lcddspseg &0x20)
	{
		GPIO_Initial(GPIOC,Pin_Num_3,GPIO_ANALOG,Func0);	//SEG6
		LCDC->LCDSEG_EN_b.SEGEN5=1;
	}
	if(lcdinitstruct->lcddspseg &0x40)
	{
		GPIO_Initial(GPIOC,Pin_Num_4,GPIO_ANALOG,Func0);	//SEG7
		LCDC->LCDSEG_EN_b.SEGEN6=1;
	}
	if(lcdinitstruct->lcddspseg &0x80)
	{
		GPIO_Initial(GPIOC,Pin_Num_5,GPIO_ANALOG,Func0);	//SEG8
		LCDC->LCDSEG_EN_b.SEGEN7=1;
	}
	if(lcdinitstruct->lcddspseg &0x100)
	{
		GPIO_Initial(GPIOC,Pin_Num_6,GPIO_ANALOG,Func0);	//SEG9
		LCDC->LCDSEG_EN_b.SEGEN8=1;
	}
	if(lcdinitstruct->lcddspseg &0x200)
	{
		GPIO_Initial(GPIOC,Pin_Num_7,GPIO_ANALOG,Func0);	//SEG10
		LCDC->LCDSEG_EN_b.SEGEN9=1;
	}
	if(lcdinitstruct->lcddspseg &0x400)
	{
		GPIO_Initial(GPIOC,Pin_Num_8,GPIO_ANALOG,Func0);	//SEG11
		LCDC->LCDSEG_EN_b.SEGEN10=1;
	}
	if(lcdinitstruct->lcddspseg &0x800)
	{
		GPIO_Initial(GPIOC,Pin_Num_9,GPIO_ANALOG,Func0);	//SEG12
		LCDC->LCDSEG_EN_b.SEGEN11=1;
	}
	if(lcdinitstruct->lcddspseg &0x1000)
	{
		GPIO_Initial(GPIOC,Pin_Num_10,GPIO_ANALOG,Func0);	//SEG13
		LCDC->LCDSEG_EN_b.SEGEN12=1;
	}
	if(lcdinitstruct->lcddspseg &0x2000)
	{
		GPIO_Initial(GPIOC,Pin_Num_11,GPIO_ANALOG,Func0);	//SEG14
		LCDC->LCDSEG_EN_b.SEGEN13=1;
	}
	if(lcdinitstruct->lcddspseg &0x4000)
	{
		GPIO_Initial(GPIOC,Pin_Num_12,GPIO_ANALOG,Func0);	//SEG15
		LCDC->LCDSEG_EN_b.SEGEN14=1;
	}
	if(lcdinitstruct->lcddspseg &0x8000)
	{
		GPIO_Initial(GPIOD,Pin_Num_0,GPIO_ANALOG,Func0);	//SEG16
		LCDC->LCDSEG_EN_b.SEGEN15=1;
	}
		if(lcdinitstruct->lcddspseg &0x10000)
	{
		GPIO_Initial(GPIOD,Pin_Num_1,GPIO_ANALOG,Func0);	//SEG17
		LCDC->LCDSEG_EN_b.SEGEN16=1;
	}
	if(lcdinitstruct->lcddspseg &0x20000)
	{
		GPIO_Initial(GPIOD,Pin_Num_2,GPIO_ANALOG,Func0);	//SEG18
		LCDC->LCDSEG_EN_b.SEGEN17=1;
	}
	if(lcdinitstruct->lcddspseg &0x40000)
	{
		GPIO_Initial(GPIOA,Pin_Num_0,GPIO_ANALOG,Func0);	//SEG19
		LCDC->LCDSEG_EN_b.SEGEN18=1;
	}
	if(lcdinitstruct->lcddspseg &0x80000)
	{
		GPIO_Initial(GPIOA,Pin_Num_12,GPIO_ANALOG,Func0);	//SEG20
		LCDC->LCDSEG_EN_b.SEGEN19=1;
	}
	if(lcdinitstruct->lcddspseg &0x100000)
	{
		GPIO_Initial(GPIOA,Pin_Num_13,GPIO_ANALOG,Func0);	//SEG21
		LCDC->LCDSEG_EN_b.SEGEN20=1;
	}
	if(lcdinitstruct->lcddspseg &0x200000)
	{
		GPIO_Initial(GPIOA,Pin_Num_14,GPIO_ANALOG,Func0);	//SEG22
		LCDC->LCDSEG_EN_b.SEGEN21=1;
	}
	if(lcdinitstruct->lcddspseg &0x400000)
	{
		GPIO_Initial(GPIOA,Pin_Num_15,GPIO_ANALOG,Func0);	//SEG23
		LCDC->LCDSEG_EN_b.SEGEN22=1;
	}
	if(lcdinitstruct->lcddspseg &0x800000)
	{
		GPIO_Initial(GPIOB,Pin_Num_0,GPIO_ANALOG,Func0);	//SEG24
		LCDC->LCDSEG_EN_b.SEGEN23=1;
	}
	if(lcdinitstruct->lcddspseg &0x1000000)
	{
		GPIO_Initial(GPIOB,Pin_Num_6,GPIO_ANALOG,Func0);	//SEG25
		LCDC->LCDSEG_EN_b.SEGEN24=1;
	}
	if(lcdinitstruct->lcddspseg &0x2000000)
	{
		GPIO_Initial(GPIOB,Pin_Num_7,GPIO_ANALOG,Func0);	//SEG26
		LCDC->LCDSEG_EN_b.SEGEN25=1;
	}	
	
	if(lcdinitstruct->lcddspseg &0x4000000)
	{
		GPIO_Initial(GPIOB,Pin_Num_8,GPIO_ANALOG,Func0);	//SEG27
		LCDC->LCDSEG_EN_b.SEGEN26=1;
	}	
	if(lcdinitstruct->lcddspseg &0x8000000)
		
	{
		GPIO_Initial(GPIOB,Pin_Num_9,GPIO_ANALOG,Func0);	//SEG28
		LCDC->LCDSEG_EN_b.SEGEN27=1;
	}	
	/***************************LCD FLICK***********************/
	if(lcdinitstruct->lcdwithflick)
	{
		LCDC->LCDCTRL_b.FLICK_COM		=	lcdinitstruct->lcdflickcom;
		LCDC->LCDCTRL_b.FLICK_MODE	=	lcdinitstruct->lcdflickmode;
		LCDC->LCDTON_b.TON					=	lcdinitstruct->lcdflickton;
		LCDC->LCDTOFF_b.TOFF				=lcdinitstruct->lcdflicktoff;
	}
}

void LCD_DSP_Data(uint8_t com,uint32_t data)
{
	switch(com)
	{
		case 0: {LCDC->LCDDATA0=data&0xfffffff;break;}
		case 1: {LCDC->LCDDATA1=data&0xfffffff;break;}
		case 2: {LCDC->LCDDATA2=data&0xfffffff;break;}
		case 3: {LCDC->LCDDATA3=data&0xfffffff;break;}	
		case 4: {LCDC->LCDDATA4=data&0xfffffff;break;}
		case 5: {LCDC->LCDDATA5=data&0xfffffff;break;}
		case 6: {LCDC->LCDDATA6=data&0xfffffff;break;}
		case 7: {LCDC->LCDDATA7=data&0xfffffff;break;}
		default: {break;}
	}
}
void LCD_Flick_Data(uint32_t data)
{
	LCDC->LCDFLICKDATA_b.LCDFLICK=data&0xfffffff;
}

void LCD_DSP_Cmd(FunctionalState enable)
{
	LCDC->LCDCTRL_b.LCDEN=enable;
}
void LCD_Flick_Cmd(FunctionalState enable)
{
	LCDC->LCDCTRL_b.FLICK=enable;
}

